#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<string>

//创建全局的互斥锁与条件变量，就不用调用init 初始化，destroy 来销毁
pthread_mutex_t gmutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t gcond = PTHREAD_COND_INITIALIZER;

void* active(void* args)
{
    std::string name = static_cast<const char*>(args);
    while(true)
    {
        //竞争锁
        pthread_mutex_lock(&gmutex);
        //到条件变量下等待
        pthread_cond_wait(&gcond , &gmutex);
        //显示器文件时临界资源
        std::cout << name << " active! " <<std::endl;
        //解锁
        pthread_mutex_unlock(&gmutex);
    }
    return (void*)0;
}

int main()
{
    //主线程创建新线程
    pthread_t t1,t2,t3,t4;
    pthread_create(&t1,nullptr,active , (void*)"thread-1");
    pthread_create(&t2,nullptr,active , (void*)"thread-2");
    pthread_create(&t3,nullptr,active , (void*)"thread-3");
    pthread_create(&t4,nullptr,active , (void*)"thread-4");

    sleep(5);//确保所有线程均在条件变量下等待

    //主线程调用pthread_cond_signal 唤醒一个线程
    while(true)
    {
        // pthread_cond_signal(&gcond);
        //pthread_cond_signal 每次只唤醒条件变量中等待队列中的一个线程，所以会让线程执行具有一定的顺序性
        //pthread_cond_broadcast 会唤醒该条件变量等待队列中所有的线程，让多个线程请竞争执行，没竞争到的继续排队
        pthread_cond_broadcast(&gcond);
        sleep(1);
    }

    //主线程等待新线程，以获取新线程的退出码
    pthread_join(t1,nullptr);
    pthread_join(t2,nullptr);
    pthread_join(t3,nullptr);
    pthread_join(t4,nullptr);
    return 0;
}